ECS Fargate是一個Serverless的服務,Serverless顧名思義就是無伺服器,不用花時間去管理EC2,由AWS去分配Fargate的資源並維護host,相比之下,ECS則可以連進EC2 host做參數設定,以及docker exec進到container debug。主要還是取決應用場景。
Fargate也是會由Cluster、Service和Task三者組成服務。
ECS EC2 mode與Fargate mode在CDK上,會有很多相似之處,主要差別會在於,EC2以及EBS上的設定,而Fargate mode就不需要做EC2 & EBS的設定。此篇,subnet的設定會以Day15的方式去建置
VPC設定,由自己去設定public subnet,這邊不會用到private subnet,所以將NAT參數設成0
vpc = ec2.Vpc(self, "VPC",
cidr="10.0.0.0/16",
enable_dns_hostnames=True,
enable_dns_support=True,
max_azs=0,
nat_gateways=0)
Public Subnet設定,參數如同前面章節一樣
public_subnet = ec2.Subnet(self, "public-subnet1",
availability_zone="us-east-2a",
cidr_block="10.0.10.0/24",
vpc_id=vpc.vpc_id,
map_public_ip_on_launch=True)
public_subnet.add_default_internet_route(gateway_id=vpc.internet_gateway_id, gateway_attachment=vpc)
增加Security Group的設定,但只允許HTTP protocol對外,因為Fargate把Host封裝起來,我們是無法訪問,所以就無需增加SSH rules
sg = ec2.SecurityGroup(self, "CDK-SG",
vpc=vpc,
description="cdk create security group",
security_group_name="cdkSG")
sg.add_ingress_rule(peer=ec2.Peer.any_ipv4(), connection=ec2.Port.tcp(80), description="cdk allow anywhere about HTTP protocol")
cluster = ecs.Cluster(self, "Fargate-Cluster",
enable_fargate_capacity_providers=True,
vpc=vpc)
定義Fargate Task,在設定CPU和Memory的時候,Memory必須為2倍的CPU。在設計應用程式的時候,也需要給予足夠多的Memory,因為應用程式在執行的時候,若Memory不足很容易造成,程式崩潰。
task = ecs.FargateTaskDefinition(self, "fargate-task",
cpu=1024,
memory_limit_mib=2048,
)
task.add_container(id="app",
image=ecs.ContainerImage.from_registry("johnson860312/awswebdb"),
container_name="mycontainer",
port_mappings=[
ecs.PortMapping(container_port=80,
host_port=80,
protocol=ecs.Protocol.TCP)
],
cpu=128,
memory_reservation_mib=256
)
最後再由Service去做Task的執行使用,設定Public IP以及在哪個Subnet上
svc = ecs.FargateService(self, "fargate-svc",
task_definition=task,
cluster=cluster,
security_groups=[sg],
assign_public_ip=True,
vpc_subnets=ec2.SubnetSelection(
subnets=[public_subnet, public_subnet2]
),
desired_count=3
)
上述的做法就可以快速建立Fargate,並將想要應用程式執行在Container,並在browser上訪問